#ifndef __MG4005_DRIVER_H
#define __MG4005_DRIVER_H

#include "main.h"

#define MG_CAN hcan

enum MG_ID
{
    MG_M1_ID = 0x141,
    MG_M2_ID = 0x142,
    MG_M3_ID = 0x143,
    MG_M4_ID = 0x144,
    MG_M5_ID = 0x145,
};

typedef struct
{
    uint8_t ID;
    int8_t temperature;
    int16_t current;
    int16_t speed;
    uint16_t encoder;

    float total_angle;
    float angle;
} MG_measure_t;

// MG电机CAN中断回调
extern void MG_CAN_Callback(CAN_RxHeaderTypeDef *pHeader, uint8_t *pBuf);
/**
 * 电机初始化
 * 输入电机结构体数组、数量和电机ID
 */
extern void MG_Init(MG_measure_t *MG, int MG_Motor_Count, ...);

/**
 * 设置当前位置为电机零点
 * 重新上电后生效
 */
extern void MG_WriteZero(MG_measure_t *MG);

/**
 * 读取多圈角度命令
 * 顺时针为正
 * 单位°
 */
extern void MG_ReadAngle(MG_measure_t *MG);

/**
 * 读取单圈角度命令
 * 顺时针为正
 * 单位°
 */
extern void MG_ReadOneAngle(MG_measure_t *MG);

/**
 * 读取电机错误命令
 */
extern void MG_ReadErrorState(MG_measure_t *MG);

// 电机关闭
extern void MG_Close(MG_measure_t *MG);
// 电机停止
extern void MG_Stop(MG_measure_t *MG);
// 电机运行
extern void MG_Run(MG_measure_t *MG);

/**
 * 速度闭环
 * 单位°/s
 */
extern void MG_SetSpeed(MG_measure_t *MG, float speed);

/**
 * 位置闭环控制2
 * 多圈控制
 * 设置转角和电机最大速度
 */
extern void MG_SetAngle(MG_measure_t *MG, float angle, uint16_t maxSpeed);

/**
 * 位置闭环控制4
 * 单圈控制
 * 设置转角和最大速度
 * Dir为0x00表示顺时针, 为0x01表示逆时针
 * 输入范围 0° ~ 359.99°
 */
extern void MG_SetOneAngle(MG_measure_t *MG, float angle, uint8_t dir, uint16_t maxSpeed);

/**
 * 位置闭环控制6
 * 位置增量
 * 设置增加角度和最大速度
 */
extern void MG_SetAngleInc(MG_measure_t *MG, float angle, uint16_t maxSpeed);

#endif
